import { Text, TouchableOpacity, View } from "react-native";
import styles from "./index.style";
import React from "react";
import { FileInfo } from "@/types/file-upload";
import { MessageType } from "@/types/chat-message";
import { ChatDetailContext } from "@/components/Chat/ChatDetail";
import ChatMessageStateStore from "@/store/chat-message";

interface ReplyContentProps<T extends FileInfo | MessageType> {
  /**
   * 回复ID
   */
  messageId: string;
  /**
   * 父消息发送者名称
   */
  username: string;
  /**
   * 父消息内容
   */
  content: T;
  /**
   * 父消息类型
   */
  messageType: MessageType;
  /**
   * 父消息撤回状态
   */
  revokeStatus: boolean;
}

export default function ReplyContent({
  messageId,
  username,
  content,
  messageType,
  revokeStatus = false,
}: ReplyContentProps<any>) {
  // 获取所有消息记录，用于查找原消息索引和原始内容
  const {records} = ChatMessageStateStore.getState().state;
  const { flatListRef } = React.useContext(ChatDetailContext);
  // 获取引用内容文本
  const getQuoteContent = () => {
    // 处理已撤回消息
    if (revokeStatus) {
      return "此消息已撤回";
    }

    try {
      // 处理没有消息内容的情况
      if (content === undefined || content === null) {
        // 尝试通过ID在消息列表中查找
        const originalMessage = records.find(
          (msg) => msg.messageId === messageId
        );
        if (originalMessage) {
          if (originalMessage.messageType === MessageType.TEXT) {
            // 处理文本消息
            try {
              const payload = originalMessage.content;
              if (typeof payload === "string") {
                const parsed = JSON.parse(payload);
                return parsed.text || "文本消息";
              } else if (payload && payload.text) {
                return payload.text;
              }
            } catch (e) {
              // 解析失败时返回消息类型
              return "文本消息";
            }
          } else if (originalMessage.messageType === MessageType.IMAGE) {
            return "[图片]";
          } else if (originalMessage.messageType === MessageType.VIDEO) {
            return "[视频]";
          } else if (originalMessage.messageType === MessageType.VOICE) {
            return "[语音]";
          }
        }
        // 没找到原始消息
        return `引用的消息`;
      }

      // 根据消息类型处理有内容的情况
      switch (messageType) {
        case MessageType.TEXT:
          // 复杂的文本内容处理
          if (typeof content === "string") {
            try {
              const parsed = JSON.parse(content);
              return parsed.text || "文本消息";
            } catch (e) {
              // 解析失败尝试直接返回
              return content;
            }
          } else if (content && typeof content === "object") {
            // 对象类型直接获取text属性
            return content.text || "文本消息";
          }
          return "文本消息";

        case MessageType.IMAGE:
          return "[图片]";
        case MessageType.VIDEO:
          return "[视频]";
        case MessageType.VOICE:
          return "[语音]";
        default:
          return "消息";
      }
    } catch (e) {
      // 发生任何异常，返回基本信息
      return "引用消息";
    }
  };

  // 跳转到原消息
  const scrollToOriginalMessage = () => {
    try {
      // 查找原消息在列表中的索引
      const messageIndex = records.findIndex(
        (msg) => msg.messageId === messageId
      );

      // 如果找到了消息
      if (messageIndex !== -1) {
        flatListRef.current?.scrollToIndex({
          animated: true,
          index: messageIndex,
          viewPosition: 0.5, // 滚动到中间位置
        });
      }
    } catch (error) {
      // 忽略滚动错误
    }
  };

  // 这里使用变量，避免每次渲染都重新计算
  const quoteContent = getQuoteContent();

  // 必须有parentMessageId才渲染
  if (!messageId) return null;

  return (
    <TouchableOpacity
      activeOpacity={0.7}
      onPress={scrollToOriginalMessage}
      style={styles.replyContainer}
    >
      <View style={styles.replyTextContainer}>
        <Text style={styles.replySenderName}>{username || "未知用户"}</Text>
        <Text style={styles.replyText}>{quoteContent}</Text>
      </View>
    </TouchableOpacity>
  );
}
